home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / pctecap.arc / DPFCOM.ASM < prev    next >
Assembly Source File  |  1986-03-15  |  10KB  |  383 lines

  1.     PAGE 60,132
  2.     PAGE
  3. TITLE    DPFILE
  4. ;
  5. ;    (C)COPYRIGHT 1983 - REAL TIME CONCEPTS, INC.
  6. ;
  7. ;    AUTHOR: THOMAS V. CARTER
  8. ;
  9. ;    PC DOS FILE DUMP UTILITY PROGRAM
  10. ;
  11. CODSEG SEGMENT PARA PUBLIC 'CODE'
  12. ;
  13. ;    START ADDRESS IS AT OFFSET 100 HEX
  14. ;
  15.     ORG    100H            ;SET IC TO 100 HEX
  16. ;
  17. DPFILE    PROC    FAR
  18.     ASSUME     CS:CODSEG        ;CS = CODE SGEMENT
  19.     ASSUME     DS:CODSEG        ;DS = CODE SEGMENT
  20.     ASSUME     SS:CODSEG        ;SS = CODE SEGMENT
  21.     ASSUME     ES:CODSEG        ;ES = CODE SEGMENT
  22. ;
  23.     JMP    SSTART            ;BRANCH TO TRUE START ADDRESS
  24. ;
  25.     PAGE
  26. ;
  27. ;    ALLOCATE THE WORKING STORAGE SEGMENT
  28. ;
  29. ;    ALLOCATE THE FILE NAME OPERATOR PROMPT
  30. ;
  31. FILNAM    DB    'File name = '
  32.     DB    '$'
  33. ;
  34. ;    ALLOCATE THE BLOCK NUMBER TEXT AND WORK AREAS
  35. ;
  36. BLKNUM    DB    'Block Number = '
  37. ;
  38. BCOUNT    DB    '0000'
  39.     DW    0A0DH
  40.     DW    0A0DH
  41.     DB    '$'
  42. ;
  43. ;    ALLOCATE THE FILE OPEN ERROR ERROR MESSAGE
  44. ;
  45. OPNERM    DB    'File open error'
  46.     DW    0A0DH
  47.     DB    '$'
  48. ;
  49. ;    ALLOCATE THE FILE NOT FOUND ERROR MESSAGE
  50. ;
  51. NOFILE    DB    'File not found'
  52.     DW    0A0DH
  53.     DB    '$'
  54. ;
  55. ;    DEFINE CARRIAGE RETURN AND LINE FEED CHARACTERS
  56. ;
  57. CRLFLN    DW    0A0DH
  58.     DB    '$'
  59. ;
  60. ;    BINARY TO HEXADECIMAL CONVERSION TABLE
  61. ;
  62. ASCIIT    DB    '0123456789ABCDEF'
  63. ;
  64.     PAGE
  65. ;
  66. ;    ALLOCATE FORM FEED CHARACTER
  67. ;
  68. FMFEED    DW    0A0DH
  69.     DB    0CH
  70.     DB    '$'
  71. ;
  72. ;    ALLOCATE THE I/O BUFFER // 512 BYTES PER BLOCK
  73. ;
  74. FILBUF    DB    512 DUP(' ')
  75. ;
  76. ;    ALLOCATE THE FILESPEC INPUT STRUCTURE
  77. ;
  78. INPNAM    DB    15
  79.     DB    0
  80.     DB    15 DUP(' ')
  81. ;
  82. ;    ALLOCATE THE FILE DUMP PRINT LINE
  83. ;
  84. DPLINE    DB    78 DUP(' ')
  85.     DW    0A0DH
  86. ;
  87. ;    ALLOCATE THE HEXADECIMAL BUFFER OFFSET COUNTER
  88. ;
  89. HEXCNT    DW    0
  90. ;
  91. ;    DEFINE BINARY TO DECIMAL DIVISORS
  92. ;
  93. BINDEC    DW    1000
  94.     DW    100
  95.     DW    10
  96. ;
  97.     PAGE
  98. ;
  99. ;    PC DOS FILE DUMP UTILITY PROGRAM
  100. ;
  101. ;    INITIALIZE THE PROGRAM ENVIRONMENT
  102. ;
  103. SSTART:
  104.     SUB    AX,AX            ;AX = ZERO // SET FOR STACK
  105.     MOV    BP,80H            ;BP = 80H // TOP OF STACK
  106.     MOV    [BP],AX            ;SETUP BLOCK NUMBER ZERO
  107.     MOV    SP,100H            ;SP = 100H = END OF STACK
  108. ;
  109. ;    DISPLAY THE FILE NAME PROMPT TO THE OPERATOR
  110. ;
  111.     MOV    DX,OFFSET FILNAM    ;DX = PROMPT OFFSET ADDRESS
  112.     MOV    AH,09H            ;AH = 9 = DISPLAY PROMPT
  113.     INT    21H            ;CALL DOS FOR SERVICE
  114. ;
  115. ;    ACQUIRE THE OPERATOR RESPONSE // FILESPEC 
  116. ;
  117.     MOV    DX,OFFSET INPNAM    ;DX = SEGMENT OFFSET ANSWER
  118.     MOV    AH,0AH            ;AH = A = KEYBOARD INPUT
  119.     INT    21H            ;CALL DOS FOR SERVICE
  120. ;
  121. ;    SEND CARRIAGE RETURN AND LINE FEED FOR APPEARANCES
  122. ;
  123.     MOV    DX,OFFSET CRLFLN    ;DX = CR/LF OFFSET ADDRESS
  124.     MOV    AH,09H            ;AH = 9 = DISPLAY CR AND LF
  125.     INT    21H            ;CALL DOS FOR SERVICE
  126. ;
  127. ;    PARSE THE OPERATOR SPECIFIED FILESPEC
  128. ;
  129.     MOV    SI,OFFSET INPNAM+2    ;SI = FILESPEC OFFSET ADDRESS
  130.     MOV    DI,5CH            ;DI = 1ST PROGRAM PREFIX FCB
  131.     SUB    AL,AL            ;AL = ZERO 
  132.     MOV    AH,29H            ;PARSE THE RECEIVED FILE NAME
  133.     INT    21H            ;CALL DOS FOR SERVICE
  134. ;
  135.     PAGE
  136. ;
  137. ;    FILESPEC PARSED (1ST PROGRAM PREFIX FCB) // OPEN THE FILE
  138. ;
  139.     MOV    DX,5CH            ;DX = 1ST PROGRAM PREFIX FCB
  140.     MOV    AH,0FH            ;AH = F = OPEN THE FILE
  141.     INT    21H            ;CALL DOS FOR SERVICE
  142. ;
  143.     CMP    AL,0            ;AL = OPEN FILE RETURN STATUS
  144.     JE     DPF010            ;BRANCH IF SUCCESSFUL OPEN
  145. ;
  146. ;    FILE OPEN ERROR - NOTIFY THE OPERATOR AND TERMINATE
  147. ;
  148.     MOV    DX,OFFSET OPNERM    ;DX = OPEN ERROR MESSAGE OFFSET
  149.     MOV    AH,09H            ;AH = 9 = DISPLAY ERROR MESSAGE
  150.     INT    21H            ;CALL DOS FOR SERVICE
  151. ;
  152.     INT    20H            ;TERMINATE PROGRAM EXECUTION
  153. ;
  154. ;    SEND CARRIAGE RETURN AND LINE FEED FOR APPEARANCES
  155. ;
  156. DPF010:
  157.     MOV    DX,OFFSET CRLFLN    ;DX = CR/LF OFFSET ADDRESS
  158.     MOV    AH,09H            ;AH = 9 = DISPLAY CR AND LF
  159.     INT    21H            ;CALL DOS FOR SERVICE
  160. ;
  161. ;    SETUP THE DATA TRANSFER ADDRESS (DTA)
  162. ;
  163.     MOV    DX,OFFSET FILBUF    ;DX = I/O BUFFER OFFSET ADDRESS
  164.     MOV    AH,1AH            ;AH = 1A = SETUP DTA
  165.     INT    21H            ;CALL DOS FOR SERVICE
  166. ;
  167. ;    INITIALIZE THE 1ST PROGRAM PREFIX FILE CONTROL BLOCK
  168. ;
  169.     MOV    DI,5CH            ;DI = FCB OFFSET ADDRESS
  170.     MOV    AX,512            ;AX = 512 = RECORD SIZE
  171.     MOV    [DI+14],AX        ;SETUP LOGICAL RECORD SIZE
  172.     SUB    AX,AX            ;AX = ZERO
  173.     MOV    [DI+32],AX        ;SETUP RANDOM RECORD NUMBER
  174.     MOV    [DI+34],AX        ;SETUP RANDOM RECORD NUMBER
  175.     MOV    [DI+36],AL        ;SETUP RANDOM RECORD NUMBER
  176. ;
  177.     PAGE
  178. ;
  179. ;    SETUP TO CLEAR THE FILE I/O BUFFER
  180. ;
  181. DPF020:
  182.     MOV    CX,256            ;CX = LOOP CONTROL COUNTER
  183.     MOV    DI,OFFSET FILBUF    ;DI = I/O BUFFER OFFSET ADDRESS
  184.     SUB    AX,AX            ;AX = ZEROS
  185. ;
  186. ;    SET THE CONTENTS OF THE I/O BUFFER TO BINARY ZEROS
  187. ;
  188. DPF030:
  189.     MOV    [DI],AX            ;SET I/O BUFFER TO BINARY ZEROS
  190.     ADD    DI,2            ;INCREMENT DI TO NEXT WORD
  191.     LOOP    DPF030            ;LOOP FOR ALL BUFFER WORDS
  192. ;
  193. ;    READ EACH 512 BYTE BLOCK OF THE FILE // RANDOM BLOCK READ
  194. ;
  195.     MOV    DX,5CH            ;DX = 1ST PROGRAM PREFIX FCB
  196.     MOV    CX,1            ;CX = NUMBER OF RECORDS
  197.     MOV    AH,27H            ;AH = 27 = RANDOM BLOCK READ
  198.     INT    21H            ;CALL DOS FOR SERVICE
  199. ;
  200.     CMP    AL,0            ;VERIFY DISK READ COMPLETION
  201.     JE    DPF040            ;BRANCH IF SUCCESSFUL READ
  202.     CMP    CX,0            ;CHECK FOR PARTIAL BLOCK
  203.     JNE    DPF040            ;BRANCH IF DATA IN BUFFER
  204. ;
  205.     INT    20H            ;TERMINATE PROGRAM EXECUTION
  206. ;
  207. ;    CONVERT DATA TO DISPLAYABLE ASCII AND DISPLAY
  208. ;
  209. DPF040:
  210.     MOV    DI,OFFSET BCOUNT    ;DI = BLOCK COUNT ADDRESS
  211.     MOV    AX,[BP]            ;AX = CURRENT BLOCK COUNT
  212.     INC    AX            ;INCREMENT BLOCK COUNT
  213.     MOV    [BP],AX            ;SAVE NEW BLOCK COUNT
  214.     DEC    AX            ;DECREMENT BLOCK COUNT
  215.     CALL    BDCONV            ;BINARY TO DECIMAL CONVERSION
  216.     MOV    DX,OFFSET BLKNUM    ;DX = BLOCK NUMBER MESSAGE
  217.     MOV    AH,09H            ;AH = 9 = DISPLAY BLOCK NUMBER
  218.     INT    21H            ;CALL DOS FOR SERVICE
  219.     MOV    SI,OFFSET FILBUF    ;SI = FILE I/O BUFFER ADDRESS
  220.     MOV    DI,OFFSET DPLINE+12    ;DI = HEXADECIMAL DISPLAY AREA
  221.     MOV    BP,OFFSET DPLINE+62    ;BP = ASCII DISPLAY AREA
  222.     MOV    CX,32            ;CX = NUMBER OF 16 BYTE LINES
  223.     PUSH    CX            ;SAVE CX REGISTER ON THE STACK
  224.     MOV    CX,16            ;CONVERSION LOOP COUNTER
  225. ;
  226.     PAGE
  227. ;
  228. ;    CONVERT A BYTE OF INPUT DATA TO HEXADECIMAL
  229. ;
  230. DPF050:
  231.     CMP    CX,8            ;HALF OF LINE CONVERTED?
  232.     JNE    DPF060            ;BRANCH TO CONTINUE - NOT HALF
  233.     DEC    DI            ;DECREMENT LINE POSITION INDEX
  234.     MOV    AL,'-'            ;MOVE A DASH TO SEPARATE HALFS
  235.     MOV    [DI],AL            ;MOVE A DASH TO SEPARATE HALFS
  236.     INC    DI            ;INCREMENT LINE POSITION INDEX
  237. ;
  238. ;    SAVE CX ON THE STACK AND PROCESS NEXT BYTE
  239. ;
  240. DPF060:
  241.     PUSH    CX            ;SAVE CONVERSION LOOP COUNTER
  242.     MOV    CL,4            ;CL = 4 = SHIFT COUNTER
  243.     MOV    AL,[SI]            ;AL = FILE BUFFER CHARACTER
  244.     MOV    AH,AL            ;AH = FILE BUFFER CHARACTER
  245.     CMP    AH,20H            ;COMPARE AH AN ASCII " "
  246.     JL    DPF070            ;BRANCH IF UNDISPLAYABLE
  247.     CMP    AH,7EH            ;COMPARE AH TO ASCII "~"
  248.     JNG    DPF080            ;BRANCH IF DISPLAYABLE
  249. ;
  250. ;    SET AH TO AN ASCII PERIOD // NON-DISPLAYABLE CHARACTER
  251. ;
  252. DPF070:
  253.     MOV    AH,"."            ;AH = AN ASCII PERIOD
  254. ;
  255. ;    AH CONTAINS THE DISPLAYABLE ASCII CHARACTER
  256. ;
  257. DPF080:
  258.     MOV    DS:[BP],AH        ;MOVE CHARACTER TO ASCII AREA
  259.     SUB    AH,AH            ;AH = ZEROS // SET FOR CONVERT
  260.     SHL    AX,CL            ;POSITION UPPER CL BITS OF AL
  261.     SHR    AL,CL            ;POSITION LOWER CL BITS OF AL
  262.     XCHG    AL,AH            ;EXCHANGE CONTENTS OF AL AND AH
  263.     PUSH    AX            ;SAVE CONTENTS OF AX ON STACK
  264.     MOV    BX,OFFSET ASCIIT    ;BX = ASCII TABLE ADDRESS
  265.     XLAT    ASCIIT            ;CONVERT CHARACTER TO HEX
  266.     MOV    [DI],AL            ;MOVE CHARACTER TO DISPLAY LINE
  267.     INC    DI            ;INCREMENT STORAGE INDEX
  268.     POP    AX            ;RESTORE ORIGINAL AX CONTENTS
  269.     MOV    CL,8            ;CL = 8 = SHIFT COUNTER
  270.     SHR    AX,CL            ;POSITION UPPER 8 BITS
  271.     XLAT    ASCIIT            ;CONVERT CHARACTER TO HEX
  272.     MOV    [DI],AL            ;MOVE CHARACTER TO DISPLAY LINE
  273.     ADD    DI,2            ;INCREMENT DI FOR NEXT BYTE
  274.     INC    SI            ;INCREMENT SI FOR NEXT BYTE
  275.     INC    BP            ;INCREMENT BP FOR NEXT BYTE
  276.     POP    CX            ;RESTORE LOOP CONTROL COUNTER
  277.     LOOP    DPF050            ;BRANCH TO CONVERT FULL LINE
  278. ;
  279.     PAGE
  280. ;
  281. ;    CONVERT AND SETUP RELATIVE BUFFER OFFSET
  282. ;
  283.     MOV    AX,HEXCNT        ;AX = CURRENT BUFFER OFFSET
  284.     MOV    DI,OFFSET DPLINE+6    ;DI = DISPLAY LINE OFFSET
  285.     PUSH    SI            ;SAVE BUFFER INDEX ON STACK
  286.     CALL    BDCONV            ;BINARY TO DECIMAL CONVERSION
  287.     POP    SI            ;RESTORE BUFFER INDEX
  288.     MOV    DI,OFFSET DPLINE    ;DI = DISPLAY LINE OFFSET
  289.     MOV    AX,HEXCNT        ;AX = CURRENT BUFFER OFFSET
  290.     MOV    CX,4            ;CX = LOOP COUNTER (4 BYTES)
  291. ;
  292. ;    CONVERT HEXADECIMAL TO ASCII // BUFFER OFFSET
  293. ;
  294. DPF090:
  295.     PUSH    CX            ;SAVE LOOP COUNTER ON STACK
  296.     MOV    CL,4            ;CL = 4 = SHIFT COUNTER
  297.     PUSH    AX            ;SAVE CURRENT BUFFER OFFSET
  298.     AND    AX,0F000H        ;ISOLATE UPPER NIBBLE // 4 BITS
  299.     XCHG    AL,AH            ;EXCHANGE VALUES IN AL AND AH
  300.     SHR    AL,CL            ;POSITION 4-BIT NIBBLE
  301.     XLAT    ASCIIT            ;CONVERT TO HEXADECIMAL BYTE
  302.     MOV    [DI],AL            ;STORE CONVERTED BYTE // HEX
  303.     INC    DI            ;INCREMENT BYTE STORAGE INDEX
  304.     POP    AX            ;RESTORE CONTENTS TO AX
  305.     SHL    AX,CL            ;POSITION NEXT 4-BIT NIBBLE
  306.     POP    CX            ;RESTORE THE LOOP COUNTER
  307.     LOOP    DPF090            ;LOOP TO CONVERT ALL NIBBLES
  308. ;
  309. ;    DISPLAY THE LAST LINE CONVERTED
  310. ;
  311.     ADD    HEXCNT,16        ;UPDATE HEX OFFSET COUNTER
  312.     MOV    BX,OFFSET DPLINE    ;BX = HEXADECIMAL DISPLAY AREA
  313.     MOV    CX,80            ;CX = DISPLAY LINE BYTE COUNT
  314. ;
  315. ;    DISPLAY A CONVERTED BYTE OF DATA
  316. ;
  317. DPF100:
  318.     MOV    DL,[BX]            ;DL = CONVERTED DATA BYTE
  319.     INC    BX            ;INCREMENT BX TO NEXT BYTE
  320.     MOV    AH,02H            ;AH = 2 = DISPLAY CHARACTER
  321.     INT    21H            ;CALL DOS FOR SERVICE
  322.     LOOP    DPF100            ;BRANCH TO DISPLAY NEXT BYTE
  323.     POP    CX            ;RESTORE BLOCK COUNTER
  324.     LOOP    DPF110            ;BRANCH TO PRINT NEXT LINE
  325.     MOV    HEXCNT,0        ;RESET THE HEX OFFSET COUNTER
  326.     MOV    DX,OFFSET FMFEED    ;DX = CR, LF, AND FF BUFFER
  327.     MOV    AH,09H            ;AH = 9 = WRITE DATA TO DISPLAY
  328.     INT    21H            ;CALL DOS FOR SERVICE
  329.     MOV    BP,80H            ;BP = 80H // TOP OF STACK
  330.     JMP    DPF020            ;BRANCH TO READ NEXT BLOCK
  331.     PAGE
  332. ;
  333. ;    CONVERT AND DISPLAY NEXT 16 BYTES OF DATA
  334. ;
  335. DPF110:
  336.     PUSH     CX            ;SAVE CONTENTS OF LINE COUNTER
  337.     MOV    AX,2020H        ;AX = 2 ASCII SPACES
  338.     MOV    CX,39            ;CX = NUMBER OF WORDS TO SET
  339.     MOV    DI,OFFSET DPLINE    ;DI = DISPLAY LINE OFFSET
  340. ;
  341. ;    MOVE ASCII SPACES TO THE DISPLAY LINE BUFFER
  342. ;
  343. DPF120:
  344.     MOV    [DI],AX            ;MOVE SPACES TO DISPLAY LINE
  345.     ADD    DI,2            ;INCREMENT DI BY WORDS
  346.     LOOP    DPF120            ;BRANCH TO SET ALL WORDS
  347. ;
  348.     MOV    DI,OFFSET DPLINE+12    ;DI = HEXADECIMAL DISPLAY AREA
  349.     MOV    BP,OFFSET DPLINE+62    ;BP = ASCII DISPLAY AREA
  350.     MOV    CX,16            ;RESET LINE CONVERSION COUNTER
  351.     JMP    DPF050            ;BRANCH TO CONVERT NEXT LINE
  352. ;
  353. DPFILE    ENDP
  354. ;
  355.     PAGE
  356. ;
  357. ;    BINARY TO DECIMAL (ASCII) CONVERSION
  358. ;
  359. BDCONV    PROC    NEAR
  360.     MOV    CX,3            ;CX = LOOP COUNTER
  361.     SUB    SI,SI            ;SI = ZERO // FOR INDEX
  362. ;
  363. ;    BINARY TO DECIMAL CONVERSION LOOP
  364. ;
  365. BDC010:
  366.     SUB    DX,DX            ;DX = ZERO // FOR DIVISION
  367.     DIV    BINDEC[SI]        ;DIVIDE FOR DECIMAL DIGIT
  368.     ADD    AL,30H            ;ADD 30H FOR ASCII NUMBER
  369.     MOV    [DI],AL            ;STORE ASCII NUMERIC DIGIT
  370.     INC    DI            ;INCREMENT FOR NEXT NUMBER
  371.     ADD    SI,2            ;INCREMENT SI FOR NEXT NUMBER
  372.     MOV    AX,DX            ;RESTORE REMAINDER TO AX
  373.     LOOP    BDC010            ;BRANCH TO CONVERT ALL DATA
  374. ;
  375.     ADD    AL,30H            ;ADD 30H FOR ASCII
  376.     MOV    [DI],AL            ;STORE ASCII NUMERIC DIGIT
  377.     RET                ;RETURN TO CALLER
  378. ;
  379. BDCONV    ENDP
  380. ;
  381. CODSEG    ENDS
  382.     END    DPFILE
  383.